#include "trap.h"

// #include <stdio.h>
// #include <string.h>
// #include <assert.h>
// #include <stdint.h>
// #include <inttypes.h>
#define N 32
char data[N];

void reset() {
  int i;
  for (i = 0; i < N; i ++) {
    data[i] = i + 1;
  }
}

// 检查[l,r)区间中的值是否依次为val, val + 1, val + 2...
void check_seq(int l, int r, int val) {
  int i;
  for (i = l; i < r; i ++) {
    assert(data[i] == val + i - l);
  }
}

// 检查[l,r)区间中的值是否均为val
void check_eq(int l, int r, int val) {
  int i;
  for (i = l; i < r; i ++) {
    assert(data[i] == val);
  }
}

void check_eq_str(int l, char* val){
    int i;
    for(i = l; val[i - l] != '\0' && i < N; i++){
        assert(data[i] == val[i - l]);
    }
    if(i < N)
        assert(data[i] == '\0');
}

void check_eq_str_n(int l, char* val, int n){
    for(int i = l; val[i - l] != '\0' && i < N && i - l < n; i++){
        assert(data[i] == val[i - l]);
    }
}

void test_memset() {
  int l, r;
  for (l = 0; l < N; l ++) {
    for (r = l + 1; r <= N; r ++) {
      reset();
      uint8_t val = (l + r) / 2;
      memset(data + l, val, r - l);
      check_seq(0, l, 1);
      check_eq(l, r, val);
      check_seq(r, N, r + 1);
    }
  }
}

void test_strcpy(){
    int l;
    for(l = 0; l < N; l++){
        reset();
        char src[5] = "0000";
        strcpy((data + l), src);
        check_seq(0, l, 1);
        check_eq_str(l, src);
        check_seq(l + 5, N, l + 6);
    }
}

void test_memcpy(){
    int l;
    for(l = 0; l < N; l++){
        reset();
        char src[5]="0000";
        memcpy((data + l), src, 4);
        check_seq(0, l, 1);
        check_eq_str_n(l, src, 4);
        check_seq(l + 4, N, l + 5);
    }
}

void test_strcmp(){
    assert(strcmp("a", "b") < 0);
    assert(strcmp("b", "a") > 0);
    assert(strcmp("a", "a") == 0);
    assert(strcmp("a,", "a") > 0);
    assert(strcmp("ab", "b") < 0);
    assert(strcmp("1", "0") > 0);
}

int main(){
    // test_memset();
    // test_strcpy();
    // test_memcpy();
    test_strcmp();
}